
#include "iostream"
#include "vector"
#include "unordered_map"
#include "unordered_set"
#include "algorithm"
#include "string"
#include "list"
#include "string.h"

class OneLoop{
public:
    std::vector<std::vector<int>> vec2;
    int cnt=0;
    void input(int n){
        for(int i=0;i<n;i++){
            std::vector<int> vec;
            for (int j = 0; j < n; ++j) {
                int a;std::cin>>a;
                vec.push_back(a);
            }
            vec2.push_back(vec);
        }
    }
    void print_vec(){
        for(int i=0;i<vec2.size();i++){
            for(int j=0;j<vec2.size();j++){
                printf("%d ",vec2[i][j]);
            }
            printf("\n");
        }
    }
#define Tag_White (2)
#define Tag_Black (3)
    bool put_able(int row,int col,int tag){
        for(int i=row;i>=0;i--){
            if(vec2[i][col]==tag){
//                print_vec();
//                printf("%d %d false\n",row,col);
                return false;
            }
        }
        for(int i=row,j=col;i>=0&&j>=0;i--,j--){
            if(vec2[i][j]==tag){
//                print_vec();
//                printf("%d %d false\n",row,col);
                return false;
            }
        }
        for(int i=row,j=col;i>=0&&j<vec2.size();i--,j++){
            if(vec2[i][j]==tag){
//                print_vec();
//                printf("%d %d false\n",row,col);
                return false;
            }
        }
//        print_vec();
//        printf("%d %d true\n",row,col);
        return true;
    }
    void put_black(int row){
        if(row==vec2.size()){//递归终止
            cnt++;
            return;
        }

        for(int i=0;i<vec2.size();i++){
            if(vec2[row][i]==1){
                if(put_able(row,i,Tag_Black)){
                    vec2[row][i]=Tag_Black;
                    put_white(row+1);
                    vec2[row][i]=1;
                }
            }
        }
    }
    void put_white(int row){
        if(row==vec2.size()){//递归终止
            put_black(0);
            return;
        }
        for(int i=0;i<vec2.size();i++){
            if(vec2[row][i]==1){
                if(put_able(row,i,Tag_White)){
                    vec2[row][i]=Tag_White;
                    put_white(row+1);
                    vec2[row][i]=1;
                }
            }
        }
    }
    void run(
            int a
//            std::string&s1,std::string&s2
            ){
        input(a);
        put_white(0);
        printf("%d\n",cnt);
    }
};
class Solution {
public:
    void run() {

        bool first = true;
        int a,b,c,d,e;
//        std::string s1,s2;
        while (
                std::cin>>a
//                std::getline(std::cin,s1)
                )
        {
//            std::getline(std::cin,s2);
            OneLoop loop;
            loop.run(a);
        }
    }
};

int main() {
//    bool cur_num= true;
    Solution().run();
    return 0;
}

